class Plumbus {
}

public class TypeInference {
    void method() {
        // 显式类型
        String hello1 = "hello";
        // 类型推断
        var hello = "hello";
        // 用户定义的类型也起作用
        Plumbus pb1 = new Plumbus();
        var pb2 = new Plumbus();
    }

    // 在静态方法中也可以启用
    static void staticMethod() {
        var hello = "hello";
        var pb2 = new Plumbus();
    }

    enum Spiciness {
        NOT, MILD, MEDIUM, HOT, FLAMING
    }

    // 类型推断十分适合for循环。
    public static void main(String[] args) {
        for (var s : Spiciness.values()) {
            System.out.println(s);
        }
    }


}

class NoInference {
    String field1 = "Field initialization";
    //    var field2 = "Can't do this";

    void method() {
//        var noInference;  // 缺少初始化
//        var aNull = null; // 缺少类型
    }

//    var inferReturnType() {
//        return "Can't infer return type";
//    }
}

/*
不能在字段上使用类型推断（field2），即使看起来已经有了足够的信息来推断。

如果不提供任何初始化数据，或者提供了null，编译器就没有可以推断类型的信息，
因此无法推断出变量noInitializer和aNull的类型。

inferReturnType()方法的定义方式也不被允许，即使编译器似乎有足够的信息来确定方法的返回类型。
 */
